[IA64] pickled code fix
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Sun, 24 Sep 2006 20:01:35 +0000 (14:01 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Sun, 24 Sep 2006 20:01:35 +0000 (14:01 -0600)
Do the pickling based on xen_heap_start, rather than __va/__pa. The
__va/__pa approach doesn't work as some systems do not have their heap
located within the 4GB window.

Signed-off-by: Jes Sorensen <jes@sgi.com>
xen/arch/ia64/xen/xensetup.c
xen/include/asm-ia64/mm.h

index 4b9095c38d1e4827e240c8b03230ff4f23a07564..6065a54070757dce0172abca8edc690857f78310 100644 (file)
@@ -84,6 +84,7 @@ unsigned int opt_xenheap_megabytes = XENHEAP_DEFAULT_MB;
 unsigned long xenheap_size = XENHEAP_DEFAULT_SIZE;
 extern long running_on_sim;
 unsigned long xen_pstart;
+void *xen_heap_start;
 
 static int
 xen_count_pages(u64 start, u64 end, void *arg)
@@ -245,7 +246,6 @@ md_overlaps(efi_memory_desc_t *md, unsigned long phys_addr)
 void start_kernel(void)
 {
     char *cmdline;
-    void *heap_start;
     unsigned long nr_pages;
     unsigned long dom0_memory_start, dom0_memory_size;
     unsigned long dom0_initrd_start, dom0_initrd_size;
@@ -392,10 +392,10 @@ void start_kernel(void)
     printf("find_memory: efi_memmap_walk returns max_page=%lx\n",max_page);
     efi_print();
 
-    heap_start = memguard_init(ia64_imva(&_end));
-    printf("Before heap_start: %p\n", heap_start);
-    heap_start = __va(init_boot_allocator(__pa(heap_start)));
-    printf("After heap_start: %p\n", heap_start);
+    xen_heap_start = memguard_init(ia64_imva(&_end));
+    printf("Before xen_heap_start: %p\n", xen_heap_start);
+    xen_heap_start = __va(init_boot_allocator(__pa(xen_heap_start)));
+    printf("After xen_heap_start: %p\n", xen_heap_start);
 
     efi_memmap_walk(filter_rsvd_memory, init_boot_pages);
     efi_memmap_walk(xen_count_pages, &nr_pages);
@@ -413,10 +413,10 @@ void start_kernel(void)
 
     end_boot_allocator();
 
-    init_xenheap_pages(__pa(heap_start), xenheap_phys_end);
+    init_xenheap_pages(__pa(xen_heap_start), xenheap_phys_end);
     printk("Xen heap: %luMB (%lukB)\n",
-       (xenheap_phys_end-__pa(heap_start)) >> 20,
-       (xenheap_phys_end-__pa(heap_start)) >> 10);
+       (xenheap_phys_end-__pa(xen_heap_start)) >> 20,
+       (xenheap_phys_end-__pa(xen_heap_start)) >> 10);
 
     late_setup_arch(&cmdline);
 
index a4f59022bc7bc30f39dc1b017f55900fa11a01a1..c6d847c26bd1da21582dd3ad99a95dc1ee78f729 100644 (file)
@@ -117,10 +117,14 @@ struct page_info
 #define IS_XEN_HEAP_FRAME(_pfn) ((page_to_maddr(_pfn) < xenheap_phys_end) \
                                 && (page_to_maddr(_pfn) >= xen_pstart))
 
-static inline struct domain *unpickle_domptr(u32 _d)
-{ return (_d == 0) ? NULL : __va(_d); }
+extern void *xen_heap_start;
+#define __pickle(a)    ((unsigned long)a - (unsigned long)xen_heap_start)
+#define __unpickle(a)  (void *)(a + xen_heap_start)
+
+static inline struct domain *unpickle_domptr(u64 _d)
+{ return (_d == 0) ? NULL : __unpickle(_d); }
 static inline u32 pickle_domptr(struct domain *_d)
-{ return (_d == NULL) ? 0 : (u32)__pa(_d); }
+{ return (_d == NULL) ? 0 : (u32)__pickle(_d); }
 
 #define page_get_owner(_p)     (unpickle_domptr((_p)->u.inuse._domain))
 #define page_set_owner(_p, _d) ((_p)->u.inuse._domain = pickle_domptr(_d))